package our.pack;

import java.io.File;
import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class MetaDataDataSource {
	
	private SQLiteDatabase database;
	private DatabaseHelper dbHelper;
	private String[] allColums = { DatabaseHelper.getMetadataid(), DatabaseHelper.getMetadataname(), DatabaseHelper.getMetadatapath(), DatabaseHelper.getMetadatadate(), DatabaseHelper.getMetadatatype(), DatabaseHelper.getPointsID() };
	
	public MetaDataDataSource(Context context){
		dbHelper = new DatabaseHelper(context);
	}
	
	/**
	 *  opens the database
	 * @throws SQLException
	 */
	public void open() throws SQLException {
		database = dbHelper.getWritableDatabase();
	}
	
	/**
	 * closes the database
	 */
	public void close() {
		dbHelper.close();
	}
	
	/**
	 * 
	 * Eerst worden de waardes in de database gestopt, vervolgens wordt er een cursor aangemaakt die de laatste entry in de database afleest
	 * de cursorToMetaData(Cursor cursor) functie zorgt vervolgens dat er een MetaData object wordt aangemaakt met de laatste waardes uit de database
	 * 
	 * @param name
	 * de naam van de metadata
	 * @param path
	 * de path waarin de metadata wordt opgeslagen
	 * @param date
	 * de datum waarop de metadata is aangemaakt, in een string
	 * @param type
	 * het type van de metadata, dit kan zijn: photo, video, text en audio
	 * @param point
	 * de point waarop de metadata is gemaakt
	 * @return
	 */
	public MetaData createMetaData(String name, String path, String date, String type, MyPoint point) {
		ContentValues values = new ContentValues();
		values.put(DatabaseHelper.getMetadataname(), name);
		values.put(DatabaseHelper.getMetadatapath(), path);
		values.put(DatabaseHelper.getMetadatadate(), date);
		values.put(DatabaseHelper.getMetadatatype(), type);
		values.put(DatabaseHelper.getPointsID(), point.getPointsID());
		long insterId = database.insert(DatabaseHelper.getMetadatatable(), null, values);
		Cursor cursor = database.query(DatabaseHelper.getMetadatatable(), allColums, DatabaseHelper.getMetadataid(), null, null, null, null);
		cursor.moveToLast();
		MetaData newMetaData = cursorToMetaData(cursor);
		cursor.close();
		return newMetaData;
	}
	
	public void deleteMetaData(MetaData m ) {
		long id = m.getID();
		database.delete(DatabaseHelper.getMetadatatable(), DatabaseHelper.getMetadataid() + " = " + id , null);
		String fileName = m.getPath();
		File file = new File(fileName);
		file.delete();
		 
	}
	
	/**
	 * 
	 * maakt een nieuw MetaData object aan voor de row van de database waar de cursor op staat
	 * 
	 * @param cursor 
	 * @return
	 * geeft een MetaData object terug
	 */
	private MetaData cursorToMetaData(Cursor cursor) {
		MetaData m = new MetaData();
		m.setID(cursor.getLong(0));
		m.setName(cursor.getString(1));
		m.setPath(cursor.getString(2));
		m.setDate(cursor.getString(3));
		m.setType(cursor.getString(4));
		m.setPointsID(cursor.getLong(5));
		return m;		
	}
	
	public ArrayList<MetaData> getAllMetaData() {
		ArrayList<MetaData> metadatas = new ArrayList<MetaData>();
		
		Cursor cursor = database.query(DatabaseHelper.getMetadatatable(), allColums, null, null, null, null, null);
		cursor.moveToFirst();
		while(!cursor.isAfterLast()) {
			MetaData m = cursorToMetaData(cursor);
			metadatas.add(m);
			cursor.moveToNext();
		}
		
		cursor.close();
		
		return metadatas;
	}
	
	public long getLatestId() {
		Cursor cursor = database.query(DatabaseHelper.getMetadatatable(), allColums, null, null, null, null, null);
		//Log.d("metadatadatasource", "" + cursor.getCount());
		if(getAllMetaData().size() > 0 ) {
			cursor.moveToLast();
			MetaData m = cursorToMetaData(cursor);
			long lastId = m.getID();
			
			cursor.close();
			
			return lastId;
		}
		else {
			return 0;
		}
		
		
	}
	
	public void removeAllMetaData() {
		for( MetaData d : getAllMetaData()) {
			deleteMetaData(d);
		}
	}
	
	public void renameMetaData(MetaData m, String name) {
		
		ContentValues values = new ContentValues();
		values.put(DatabaseHelper.getMetadataname(), name);
		database.update(DatabaseHelper.getMetadatatable(), values, m.getID() + " = " + DatabaseHelper.getMetadataid() , null);
		
	}

}
